package com.huangsm.concurrence.atomic;

import java.util.concurrent.atomic.AtomicReference;

/**
 * 原子性引用型
 * @author huang
 * @PACKAGE_NAME com.huangsm.concurrence.atomic
 * @PROJECT_NAME concurrence
 * @date 2019/2/15
 */
public class AtomicReferenceDemo {
    public static void main(String[] args) {
        /**
         * AtomicReference 提供了一个可以被原子性读和写的对象引用变量。
         * 原子性的意思是多个想要改变同一个 AtomicReference 的线程不会导致 AtomicReference 处于不一致的状态。AtomicReference 还有一个 compareAndSet() 方法，
         * 通过它你可以将当前引用于一个期望值(引用)进行比较，如果相等，在该 AtomicReference 对象内部设置一个新的引用。
         */
        String initialReference="the initally referenced string";
        AtomicReference atomicReference=new AtomicReference(initialReference);

        //泛型AtomicReference
        AtomicReference<String> stringAtomicReference=new AtomicReference<>();
        /**
         * AtomicReference 类具备了一个很有用的方法：compareAndSet()。compareAndSet() 可以将保存在 AtomicReference 里的引用于一个期望引用进行比较，如果两个引用是一样的(并非 equals() 的相等，而是 == 的一样)，将会给 AtomicReference 实例设置一个新的引用。
         * 如果 compareAndSet() 为 AtomicReference 设置了一个新的引用，compareAndSet() 将返回 true。否则 compareAndSet() 返回 false。
         */
        String initialReference1 = "initial value referenced";

        AtomicReference<String> atomicStringReference =
                new AtomicReference<String>(initialReference1);

        String newReference = "new value referenced";
        boolean exchanged = atomicStringReference.compareAndSet(initialReference1, newReference);
        System.out.println("exchanged: " + exchanged);

        exchanged = atomicStringReference.compareAndSet(initialReference1, newReference);
        System.out.println("exchanged: " + exchanged);
    }
}
